首先看下保护措施,那我们就可以写shellcode了
1 | gdb-peda$ checksec |
这个题目在新建note的时候和删除note的时候都会新建线程,这就有可能存在条件竞争了,
1 | __int64 newNote() |
当然delete的时候也会创建线程
1 | __int64 delete() |
删除的时候会睡眠两秒,usleep的单位是微秒(microseconds:即百万分之一秒)
1 | void *__fastcall deleteThread(void *a1) |
可以看到delete的sleep之前会不断将head指针减8,那我们可以让head指针减到指向free
这时候我们再malloc,就可以控制got表的地址,从而执行我们设定好的shellcode
首先head指针初始值为c0结尾
有malloc的时候head+8,所以我们将c0减到0x10,0x18执行free
所以减22次
最终
payload
1 | from pwn import * |